home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / IEFFPA.SA < prev    next >
Text File  |  1989-08-30  |  8KB  |  165 lines

  1.          TTL       IEEE FORMAT EQUIVALENT FLOAT TO ASCII (IEFFPA)
  2. ***************************************
  3. * (C) COPYRIGHT 1981 BY MOTOROLA INC. *
  4. ***************************************
  5.  
  6. *******************************************************
  7. *            IEFFPA - FLOATING POINT TO ASCII         *
  8. *     IEEE FORMAT EQUIVALENT FAST FLOATING POINT      *
  9. *                                                     *
  10. *    INPUT:  D7 - IEEE FORMAT FLOATING POINT NUMBER   *
  11. *                                                     *
  12. *    OUTPUT: D7 - THE BASE TEN EXPONENT IN BINARY     *
  13. *                 FOR THE RETURNED FORMAT IF NOT      *
  14. *                 A NAN (NOT-A-NUMBER) OR INFINITY    *
  15. *            SP - DECREMENTED BY 14 AND               *
  16. *                 POINTING TO THE CONVERTED           *
  17. *                 NUMBER IN ASCII FORMAT              *
  18. *                                                     *
  19. *            ALL OTHER REGISTERS UNAFFECTED           *
  20. *                                                     *
  21. *           MAXIMUM STACK USAGE:    48 BYTES          *
  22. *                                                     *
  23. *    CONDITION CODES:                                 *
  24. *            N - SET IF THE RESULT IS NEGATIVE        *
  25. *            Z - SET IF THE RESULT IS ZERO            *
  26. *            V - SET IF RESULT IS NAN (NOT-A-NUMBER)  *
  27. *            C - CLEARED                              *
  28. *            X - UNDEFINED                            *
  29. *                                                     *
  30. *    RETURNED FORMAT:                                 *
  31. *                                                     *
  32. *            {S}{'.'}{DDDDDDDD}{'E'}{S}{DD}           *
  33. *            <     FRACTION   >< EXPONENT >           *
  34. *                                                     *
  35. *        WHERE  S - SIGN OF MANTISSA OR EXPONENT      *
  36. *                   ('+' OR '-')                      *
  37. *               D - DECIMAL DIGIT                     *
  38. *                                                     *
  39. *        STACK OFFSET OF RESULT  S.DDDDDDDDESDD       *
  40. *        AFTER RETURN            00000000001111       *
  41. *                                01234567890123       *
  42. *                                                     *
  43. *                     -- OR --                        *
  44. *                                                     *
  45. *        '>>            '    IF POSITIVE INFINITY     *
  46. *        '<<            '    IF NEGATIVE INFINITY     *
  47. *        '..            '    IF NAN (NOT-A-NUMBER)    *
  48. *                                                     *
  49. *        EXAMPLES  '+.12000000E+03' 120               *
  50. *                  '+.31415927E+01' PI                *
  51. *                  '+.10000000E-01' ONE-HUNDREDTH     *
  52. *                  '-.12000000E+03' MINUS 120         *
  53. *                  '>>            ' PLUS INFINITY     *
  54. *                  '<<            ' NEGATIVE INFINITY *
  55. *                  '..            ' NAN (NOT-A-NUMBER)*
  56. *                                                     *
  57. *     NOTES:                                          *
  58. *       1) NORMALIZED NON-ZERO VALUES NOT WITHIN THE  *
  59. *          RANGES BELOW ARE RETURNED AS SIGNED ZEROES *
  60. *          OR SIGNED INFINITIES, WHICHEVER IS APPRO-  *
  61. *          RIATE:                                     *
  62. *                     18                           -20*
  63. *      9.22337177 X 10  > +VALUE >  5.42101070 X 10   *
  64. *                                                     *
  65. *                     18                           -20*
  66. *     -9.22337177 X 10  > -VALUE > -2.71050535 X 10   *
  67. *                                                     *
  68. *          DENORMALIZED NUMBERS ARE NOT WITHIN THE    *
  69. *          ABOVE RANGE AND ARE TREATED AS SIGNED      *
  70. *          ZEROES.
  71. *       1) THE BINARY BASE 10 EXPONENT IS RETURNED    *
  72. *          IN D7 TO FACILITATE CONVERSIONS TO         *
  73. *          OTHER FORMATS.                             *
  74. *       2) EVEN THOUGH EIGHT DIGITS ARE RETURNED, THE *
  75. *          MAXIMUM BINARY PRECISION POSSIBLE IS 24    *
  76. *          BINARY BITS WHICH EQUATES TO 7.167 DECIMAL *
  77. *          DIGITS.  SEE THE MC68344 USER'S GUIDE FOR  *
  78. *          FURTHER DETAILS ON CONVERSION ACCURACY.    *
  79. *       3) THE STACK IS LOWERED 14 BYTES BY THIS      *
  80. *          ROUTINE.  THE RETURN ADDRESS TO THE CALLER *
  81. *          IS REPLACED BY A PORTION OF THE RESULTS.   *
  82. *       4) REGISTER D7 IS MEANINGLESS IF THE VALUE IS *
  83. *          A NAN (NOT-A-NUMBER) OR INFINITY.          *
  84. *       5) FOR NEGATIVE ZEROES, THIS ROUTINE CALLS    *
  85. *          THE FAST FLOATING POINT ASCII CONVERSION   *
  86. *          ROUTINE WITH A SPECIAL PSUEDO MINUS ZERO.  *
  87. *          THIS INSURES THE RETURN OF A MINUS SIGN.   *
  88. *                                                     *
  89. *******************************************************
  90.          PAGE
  91. IEFFPA   IDNT      1,1  IEEE FORMAT EQUIVALENT CONVERT TO ASCII
  92.          OPT       PCS
  93.  
  94.          SECTION    9
  95.  
  96.          XDEF      IEFFPA    ENTRY POINT DEFINITION
  97.  
  98.          XREF      FFPFPA    FAST FLOATING POINT CONVERT ROUTINE
  99.          XREF      FFPFIEEE  FAST FLOATING POINT FROM IEEE CONVERT
  100.          XREF      FFPCPYRT  COPYRIGHT NOTICE
  101.  
  102. EXPMSK   EQU       $7F800000 IEEE FORMAT EXPONENT MASK
  103. SGNIFMSK EQU       $007FFFFF IEEE FORMAT SIGNIFICAND MASK
  104. VBIT     EQU       $02       CONDITION CODE REGISTER "V" BIT
  105. FFPPSZRO EQU       $41       FFPFPA ROUTINE PSUEDO ZERO CONVERT VALUE
  106.  
  107. ********************
  108. * CONVERT TO ASCII *
  109. ********************
  110. IEFFPA   MOVE.L   D6,-(SP) SAVE WORD REGISTER
  111. * TEST FOR NAN OR INFINITY OR ZERO
  112.          MOVE.L    D7,D6     COPY OVER ARGUMENT
  113.          ADD.L     D6,D6     SHIFT OUT SIGN BIT
  114.          BEQ.S     IEFZERO   BRANCH FOR SPECIAL CASE OF ZERO
  115.          AND.L     #EXPMSK<<1,D6     ISOLATE EXPONENT
  116.          CMP.L     #EXPMSK<<1,D6     ? ALL ONES
  117.          BNE.S     IEFCNVRT  BRANCH IF NOT
  118.          MOVE.L    D7,D6     COPY AGAIN
  119.          AND.L     #SGNIFMSK,D6  ? CHECK FOR NAN
  120.          BEQ.S     IEFISI    BRANCH IF NOT - IS INFINITY
  121.          MOVE.W    #'..',D6  SETUP NAN SYMBOL
  122.          BRA.S     IEFPLC    AND GO RETURN IT
  123.  
  124. * FORCE FFP FORMAT OVERFLOW TO INFINITY
  125. IEFRTI   MOVE.L    (SP)+,D7  RELOAD ORIGINAL IEEE VALUE
  126. * IS INFINITY
  127. IEFISI   MOVE.W    #'>>',D6  SETUP PLUS INFINITY SYMBOL
  128.          TST.L     D7        ? IS IT PLUS
  129.          BPL.S     IEFPLC    BRANCH IF SO
  130.          MOVE.W    #'<<',D6 SETUP MINUS INFINITY SYMBOL
  131. IEFPLC   SUB.L     #6,SP     SET STACK TO RETURN DATA ADDRESS
  132.          MOVE.L    10(SP),-(SP) MOVE RETURN ADDRESS BELOW THAT
  133.          MOVE.L    10(SP),-(SP) MOVE SAVED WORK REGISTER BELOW THAT
  134.          MOVE.W    D6,8(SP)  INSERT SYMBOL TO RETURN
  135.          MOVE.L    #'    ',D6 PREPARE PADDING FOR 12 BLANKS
  136.          MOVE.L    D6,10(SP) MOVE FIRST 4 IN
  137.          MOVE.L    D6,14(SP) MOVE NEXT 4 IN
  138.          MOVE.L    D6,18(SP) MOVE LAST 4 IN
  139.          MOVE.L    (SP)+,D6  RESTORE CALLER'S D6
  140.          CMP.B     #'.',4(SP) ? IS THIS A NAN
  141.          BNE.S     IEFNOTN   BRANCH IF NOT NAN
  142.          OR.B      #VBIT,CCR SET "V" BIT
  143.          RTS                 RETURN TO CALLER
  144. IEFNOTN  TST.L     D7        SET CONDITION CODE
  145.          RTS                 RETURN TO CALLER
  146.  
  147. * ZERO VALUE - CONVERT ZERO WITH PROPER SIGN BY FEEDING A PSUEDO ZERO
  148. IEFSMALL MOVE.L    (SP)+,D6  RELOAD ORIGINAL IEEE VALUE
  149.          ADD.L     D6,D6     SHIFT SIGN INTO "X" BIT
  150. IEFZERO  MOVE.L    #FFPPSZRO<<1,D7 SETUP PSUEDO ZERO FOR INTERNAL CALL
  151.          ROXR.B    #1,D7     SHIFT IN PROPER SIGN ("X" HAS SIGN)
  152.          BRA.S     IEFTOAS   NOW CONVERT THIS TO ASCII
  153.  
  154. * NOT A SPECIAL CASE - CONVERT USING FAST FLOATING POINT ROUTINES
  155. IEFCNVRT MOVE.L    D7,-(SP)  SAVE ORIGINAL VALUE IF WE NEED THE SIGN
  156.          BSR       FFPFIEEE  CONVERT TO FAST FLOATING POINT
  157.          BVS.S     IEFRTI    OVERFLOW - BRANCH TO TREAT AS AN INFINITY
  158.          BEQ.S     IEFSMALL  BRANCH IF FORCED TO ZERO, EXPONENT TOO SMALL
  159.          ADD.L     #4,SP     RID STORED VALUE FROM STACK
  160. IEFTOAS  MOVE.L    (SP)+,D6  RESTORE CALLERS D6
  161.          BRA       FFPFPA    AND CONTINUE ON THROUGH WITH FFP CONVERSION
  162.  
  163.          END
  164.  
  165.